#include "../inc/TimeDisplay.h"

/**
 * @brief TimeDisplay类的构造函数
 *
 * 初始化TimeDisplay对象，设置m_running为false。
 */
TimeDisplay::TimeDisplay()
{
    m_running = false;
}

/**
 * @brief 析构函数
 *
 * 在销毁TimeDisplay对象时调用，停止计时器。
 */
TimeDisplay::~TimeDisplay()
{
    stop();
}

/**
 * @brief 开始显示时间
 *
 * 启动时间显示线程，如果线程尚未运行，则创建并启动新线程。
 */
void TimeDisplay::start()
{
    
    // 如果线程没有运行
    if (!m_running)
    {
        // 将线程状态设置为正在运行
        m_running = true;
        // 创建一个新线程来运行TimeDisplay类的run方法
        m_thread = std::thread(&TimeDisplay::run, this);
    }
}

/**
 * @brief 停止时间显示
 *
 * 停止时间显示线程，并等待线程结束。
 */
void TimeDisplay::stop()
{
    if (m_running)
    {
        m_running = false;
        if (m_thread.joinable())
        {
            m_thread.join();
        }
    }
}

std::string TimeDisplay::getCurrentTime()
{
    auto now = std::chrono::system_clock::now();
    std::time_t time = std::chrono::system_clock::to_time_t(now);
    std::tm tm = *std::localtime(&time);
    
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tm);
    return std::string(buffer);
}

void TimeDisplay::updateDisplay()
{
    std::cout << "\rCurrent Time: " << getCurrentTime() << std::flush;
}

/**
 * @brief 运行时间显示功能
 *
 * 此函数启动时间显示功能，每秒更新一次显示内容，直到m_running为false时停止。
 */
void TimeDisplay::run()
{
    ShowFont* time_showFont = ShowFont::instance();//创建ShowFont对象,打印文字
    char time_buf[1024];//创建字符数组，用于存储时间字符串
    std::string currentTime;//创建字符串，用于存储时间
    while (m_running)
    {
        updateDisplay();
        std::this_thread::sleep_for(std::chrono::seconds(1));
        //把时间存入time_buf，打印出来
        currentTime = getCurrentTime();
        strcpy(time_buf,currentTime.c_str());
        //调用ShowFont的display方法，打印时间到LCD屏幕上
        time_showFont->display(time_buf,32, 220, 32, ShowFont::purple, ShowFont::white, 560, 78);
    }
}



/**
 * @brief 主函数
 *
 * 该函数创建一个TimeDisplay对象，启动计时显示，等待用户输入，然后停止计时显示。
 *
 * @return 返回0，表示程序正常结束。
 */
// int main()
// {
//     TimeDisplay timeDisplay;
//     timeDisplay.start();

//     std::cout << "Press Enter to stop..." << std::endl;
//     std::cin.get();

//     timeDisplay.stop();
//     return 0;
// }